如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫
本文作者:任 哲,中南财经政法大学经济学院
本文编辑:陈梦华
技术总编:王子一
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
一、观察网页 东方财富股吧是东方财富旗下的股票网络论坛,其日活跃用户和日浏览量都属于国内顶尖,所以也就成了大家爬虫的主要目标。本文以腾讯控股的股吧为例,首先对其网页进行观察。下图蓝色框框中的是公司股票代码,先记下来等会儿要考;红色框框中是帖子的排序方式,这里我们选择发帖时间,然后帖子会按照时间倒序排列。
# 腾讯控股股吧URL
http://guba.eastmoney.com/list,hk00700,f_1.html
http://guba.eastmoney.com/list,hk00700,f_2.html
http://guba.eastmoney.com/list,hk00700,f_3.html
http://guba.eastmoney.com/list,hk00700,f_4.html
http://guba.eastmoney.com/list,hk00700,f_5.html
可以看到网址的大部分都是相同的,只有f_
后面的数字是不同,很明显这之后跟的数字就是股吧里的页码数。知道这个信息,在写循环的时候就好办了,只要改变f_
后面的数字即可。可能还会有童鞋会问hk00700
是什么?这里我们回顾上图里的蓝色框框可以发现00700.hk
与hk00700
本质上是一样的,都是股票代码,明白这个,如果你想爬取其他公司的股吧标题,只需要更换股票代码即可。接下来我们使用Xpath来对标题、作者和发帖时间进行定位,如何使用Xpath进行定位本公众号之前有很多推文都讲过,这里就不再赘述了。得到定位信息之后,还不能立即着急进行爬虫,因为还要设置爬虫的终止条件。本次爬虫我们只要腾讯控股股吧6月份的标题,由于是倒序排列,那就需要我们在爬到五月份的时候停止。但是,观察发帖时间发现这些时间信息只包含日期和月份,并不包含年份,如果想要爬取三年、五年的时候该怎么设置爬虫的终止条件呢?想要达到这个目的,就要用到一些二次爬虫的技术了。首先,如下图打开一个帖子,发现红框框中有年月日信息,这样就可以提取红框框中年月日来作为终止条件了。在不使用
selenium
的情况下,该如何根据帖子的列表获取每个帖子的源代码呢?其实很简单,每个帖子标题所在标签的href
属性中都包含着该帖子的链接,这样就可以根据这个链接获取每个帖子的源代码了。再从中提取年月日,本次爬虫的准备工作就完成了。二、具体操作好了,本次爬虫的思路在上文中已经描述完了,现在就开始实操吧!
先调用本次要使用的库。
import requests
import pandas as pd
from lxml import etree
import time
import os
然后设置股票代码,并准备几个空列表,用于装取爬到的标题、作者和时间等信息。
stk = "hk00700"
title=[]
author=[]
datatime=[]
接着使用
requests
来获取网页源代码,并根据Xpath定位获取我们需要的信息。这里只是对第一页进行爬虫,想要爬取多页通过循环更改f_
后面的数字即可。因为time_list
每页包含81项,其中首项为“发帖时间”四个汉字,所以为了与标题列表匹配,要对其进行切片处理取后80项,同理对author_list
做同样处理。
url = "http://guba.eastmoney.com/list,hk00700,f_1.html"
response = requests.get(url)
tree = etree.HTML(response.text)
title_list=tree.xpath("""//*[@id="articlelistnew"]/div/span[3]/a/text()""")
author_list=tree.xpath("""//*[@id="articlelistnew"]/div/span[4]//text()""")
time_list=tree.xpath("""//*[@id="articlelistnew"]/div/span[5]/text()""")
time_list = time_list[1:] #处理time_list
title.extend(title_list)
author.extend(author_list)
datatime.extend(time_list)
再然后设置终止爬虫的判断条件,只需要判断每页最后一个帖子即可。在这一步,先从标题的标签的href属性里获取链接的一部分,再拼接上网址的前一部分"http://guba.eastmoney.com"即可获得帖子的正确链接。接着从提取发帖时间的年月日,要注意的是,如果某页最后一个帖子是有机构发布的资讯,那么我们提取信息的列表会返回空值。这时候需要设置一个判断语句,当遇到这种情况程序选择立即执行下一循环,否则提取年月日信息,并利用年月日判断是否满足终止循环的条件。具体如下:
#从标题的href属性获取
testurl_list = tree.xpath("""//*[@id="articlelistnew"]/div[81]/span[3]/a/@href""")
test_url = "http://guba.eastmoney.com" + testurl_list[0]
response_2 = requests.get(test_url)
#获取帖子中的日期
tree = etree.HTML(response_2.text)
test_list = tree.xpath("""//*[@id="zwconttb"]/div[2]/text()""")
if test_list == [] :
time.sleep(5)
continue
else:
post_year = test_list[-1][4:8]
post_month = test_list[-1][9:11]
print(post_year,post_month)
#如果某页发帖时间为2021年5月,则停止循环
if int(post_year) == 2021 and int(post_month) ==5 :
break
else:
time.sleep(5)
continue
循环停止之后,将爬虫得到的列表放入
dataframe
中进行清洗,删除那些标题为转发,和发帖时间为5月的帖子,然后导出到Excel中即可。
#导入dataframe
stkcd_list = [stk]*len(datatime)
df = pd.DataFrame(data = [title, author, datatime,stkcd_list]).T
df.columns = ["标题", "作者","发布时间","股票代码" ]
#数据清洗
df = df[~df["标题"].str.contains("转发")]
df = df[~df["发布时间"].str.contains("05-")]
#输出到Excel
file = r"./股吧/HK00700股吧.xlsx"
df.to_excel(file, index = None)
得到的文件如下图所示:
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
利用Python构建马科维茨有效边界
rangestat,让统计量灵活滚动起来!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用Stata画的三维图很奇怪怎么办?
如何随机生成满足特定数据特征的新变量?
爬取无法翻页网页——自然科学基金项目及可视化
爬取京东评论数据进行情感分类
Stata与音乐之间的酷炫连接
这些年,爬虫俱乐部走出的博士们!看这里,近五年各校高被引论文上榜名单!
高校经管类核心期刊发文排行榜
疯狂的科研创新加速器——Stata!
可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!
好玩有趣的手绘图形库——cutecharts
爬虫实战|摩尔庄园微博话题讨论
一季度财报出炉,哪些公司最烧钱?
一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》数据可视化利器——Matplotlib关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。